package com.swan.test.freemarker.enums;

import lombok.Getter;
import java.util.Arrays;

@Getter
public enum StatusEnum {

    /** 停用: 停止状态 */
    DISABLE(0, "停用"),

    /** 启用: 正常状态 */
    ENABLE(1, "启用"),

    ;

    // 编码
    private Integer code;

    // 描述
    private String desc;

    StatusEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    /** 获取 code 对应的枚举类型
     * @param code 枚举值
     * @return 不存在时返回 null
     */
    public static StatusEnum ofCode(Integer code) {
        return Arrays.stream(StatusEnum.values())
                .filter(item -> item.code.equals(code))
                .findAny()
                .orElse(null);
    }

    /** 获取 desc 对应的枚举类型
     * @param desc 描述
     * @return 不存在时返回 null
     */
    public static StatusEnum ofDesc(String desc) {
        return Arrays.stream(StatusEnum.values())
                .filter(item -> item.code.equals(desc))
                .findAny()
                .orElse(null);
    }

    /** 根据 desc 对应的 code
     * @param desc 描述
     * @param defaultCode 默认值
     * @return 不存在时返回默认值
     */
    public static Integer getCode(String desc, Integer... defaultCode) {
        StatusEnum statusEnum = ofDesc(desc);
        return statusEnum != null ?  statusEnum.getCode() : defaultCode.length > 0 ? defaultCode[0] : null;
    }

    /** 根据 code 对应的 desc
     * @param code 编码
     * @param defaultDesc 默认值
     * @return 不存在时返回默认值
     */
    public static String getDesc(Integer code, String... defaultDesc) {
        StatusEnum statusEnum = ofCode(code);
        return statusEnum != null ?  statusEnum.getDesc() : defaultDesc.length > 0 ? defaultDesc[0] : null;
    }

}
